from django.shortcuts import render
from django.http import JsonResponse
from django.forms import model_to_dict

from web import models
from utils.baidu.bos import delete_file, delete_file_list
from web.forms.file import FolderModelForm


# http://127.0.0.1:8001/manage/1/file/
# http://127.0.0.1:8001/manage/1/file/?folder=1
def file(request, project_id):
    """ 文件列表 & 添加文件夹 """

    parent_obj = None
    folder_id = request.GET.get('folder', '')
    # URL中带folder=x，根据folder=x去找id=x的文件或目录，如果找不到，也定义为根目录
    if folder_id.isdecimal():
        parent_obj = models.FileRepository.objects.filter(id=int(folder_id), file_type=2,
                                                          project=request.tracer.project).first()
    # 添加文件夹 & 文件夹的修改
    if request.method == 'POST':
        fid = request.POST.get('fid', '')
        edit_obj = None
        if fid.isdecimal():
            edit_obj = models.FileRepository.objects.filter(id=int(fid), file_type=2,
                                                            project=request.tracer.project).first()
        form = FolderModelForm(request, parent_obj, data=request.POST, instance=edit_obj)
        if form.is_valid():
            form.instance.project = request.tracer.project
            form.instance.file_type = 2
            form.instance.update_user = request.tracer.user
            form.instance.parent = parent_obj
            form.save()
            return JsonResponse({'status': True})
        return JsonResponse({'status': False, 'error': form.errors})

    # GET 查看页面
    breadcrumb_list = []
    parent = parent_obj
    while parent:
        # breadcrumb_list.insert(0, {'id': parent.id, 'name': parent.name})
        breadcrumb_list.insert(0, model_to_dict(parent, ['id', 'name']))
        parent = parent.parent

    # 展示当前目录下所有文件 & 文件夹获取到即可
    file_queryset = models.FileRepository.objects.filter(project=request.tracer.project)
    if parent_obj:
        # 该目录或文件有父目录 表示进入了某目录：不是根目录下该项目的所有的目录或文件
        file_obj_list = file_queryset.filter(parent=parent_obj).order_by('-file_type')
    else:
        # 根目录：根目录下该项目的所有的目录或文件
        file_obj_list = file_queryset.filter(parent__isnull=True).order_by('-file_type')

    form = FolderModelForm(request, parent_obj)
    context = {
        'form': form,
        'file_obj_list': file_obj_list,
        'breadcrumb_list': breadcrumb_list,
    }
    return render(request, 'file.html', context)


# http://127.0.0.1:8001/manage/1/file/delete/?fid=1
def file_delete(request, project_id):
    """ 删除文件 """
    fid = request.GET.get('fid')
    # 删除数据库中的 文件 & 文件夹 （级联删除：自动会删除）
    delete_obj = models.FileRepository.objects.filter(id=fid, project=request.tracer.project).first()
    if delete_obj.file_type == 1:
        # 删除文件（数据库文件删除、BOS文件删除、项目已使用空间容量还回去）
        # 删除文件，将容量还给当前项目的已使用空间
        request.tracer.project.use_space -= delete_obj.file_size
        request.tracer.project.save()

        # bos中删除文件
        delete_file(request.taecer.project.bucket, delete_obj.key)

        # 在数据库中删除当前文件
        delete_obj.delete()
        return JsonResponse({'status': True})

    # 删除文件夹（找到文件夹下所有的文件->数据库文件删除、BOS文件删除、项目已使用空间容量还回去）
    total_size = 0
    key_list = []

    folder_list = [delete_obj, ]
    for folder in folder_list:
        child_list = models.FileRepository.objects.filter(project=request.tracer.project, parent=folder).order_by('-file_type')
        for child in child_list:
            if child.file_type == 2:
                folder_list.append(child)
            else:
                # 文件大小汇总
                total_size += child.file_size
                # 删除文件
                key_list.append(child.key)

    # bos批量删除文件
    if key_list:
        delete_file_list(bucket=request.tracer.project.bucket, key_list=key_list)
    # 归还容量
    if total_size:
        request.tracer.project.use_space -= total_size
        request.tracer.project.save()

    # 删除数据库中的文件
    delete_obj.delete()
    return JsonResponse({'status': True})